/**
 **************************************************************************************************************************
 * 
 **************************************************************************************************************************
 * @file RBEffectFactory.h
 **************************************************************************************************************************/

#pragma once

#ifdef  HEADER_MSG
#pragma HEADER_MSG(RBEffectFactory.h)
#endif


/**************************************************************************************************************************
 * Includes
 **************************************************************************************************************************/
#include "RBMain/RBCommon.h"
#include "RBEffectDataContainer.h"

/**************************************************************************************************************************
 * Forward declarations
 **************************************************************************************************************************/
class RBEffectCompiler;
class RBEffectTechnique;
class RBEffect;

/**************************************************************************************************************************
 * Classes
 **************************************************************************************************************************/
class RBEffectFactory : public RBSingleton<RBEffectFactory>
{
public:
	static const char* const ms_shader_ext;
	static const char* const ms_material_ext;

                           ~RBEffectFactory         ();

    void                    AddDirectory            (const RBString& strDirectory);
    void                    AddCompiler             (RBEffectCompiler* pCompiler);
    void                    GetDirectories          (std::vector<RBString>& vDirectories);

    void                    Parse                   ();

    RBEffect*               RetrieveEffect          (const RBString& strEffectName);

    void                    AddEffect               (const RBString& strFilename);

    void                    Reset                   (bool bBeforeReset);

    RBEffectDataContainer   DataContainer;
private:
    std::vector<RBString> m_vDirectories;
    std::vector<RBEffectCompiler*> m_vCompilers;

};